import {
  createRouter,
  createWebHistory,
  createWebHashHistory,
  createMemoryHistory,
} from 'vue-router';
import { includeArray } from '@/libs/system';

import ViewUIPlus from 'view-ui-plus';

import util from '@/libs/util';

import Setting from '@/setting';

import store from '@/store/index';

// 路由数据
import routes from './routes';

import { getRoute } from '@/api/route';

// 导出路由 在 mait.ts 里使用
const router = createRouter({
  history:
    Setting.routerMode === 'history'
      ? createWebHistory(Setting.routerBase)
      : Setting.routerMode === 'hash'
      ? createWebHashHistory(Setting.routerBase)
      : createMemoryHistory(Setting.routerBase),
  routes,
});

let resTree = []; // 用于存储递归结果（扁平数据）
let routerNameList = [];

// 递归函数
const fnTree = (source) => {
  source.forEach((el) => {
    resTree.push(el);
    store.commit('admin/user/getResTreeData', resTree);
    el.children && el.children.length > 0 ? fnTree(el.children) : ''; // 子级递归
  });
};
/**
 * 路由拦截
 * 权限验证
 */

router.beforeEach((to, from, next) => {
  if (Setting.showProgressBar) ViewUIPlus.LoadingBar.start();
  // 判断是否需要登录才可以进入
  if (to.matched.some((_) => _.meta.auth)) {
    // 这里依据 token 判断是否登录，可视情况修改
    const token = window.sessionStorage.getItem('x-token');
    // const token = util.cookies.get('x-token');
    if (token && token !== 'undefined') {
      let accessList = [];

      return new Promise((resolve, reject) => {
        getRoute()
          .then((routeList) => {
            store.commit('admin/auth/setAuthList', routeList);
            fnTree(routeList);
            resTree.forEach((item) => {
              // 过滤按钮
              if (!item.leaf) {
                // 所有路由path
                accessList.push(item.path);
                // 所有路由名称
                routerNameList.push(item.meta.title);
              }
              if (to.meta.auth == item.path) {
                // 当前名称
                to.meta.title = item.meta.title;
              }
            });
            resTree = [];
            store.commit('admin/user/setRoleAuth', accessList);
            store.commit('admin/user/setRoleName', routerNameList);
            console.log('---routerNameList---', accessList);
            const isPermission = includeArray(to.meta.auth, accessList);
            if (isPermission) {
              next();
            } else {
              next({
                name: '403',
              });
            }
            resolve(isPermission);
            next();
          })
          .catch((err) => {
            reject(err);
          });
      });
    } else {
      // 没有登录的时候跳转到登录界面
      // 携带上登陆成功之后需要跳转的页面完整路径
      next({
        name: 'login',
        query: {
          redirect: to.fullPath,
        },
      });
    }
  } else {
    // 不需要身份校验 直接通过
    next();
  }
});

router.afterEach((to) => {
  if (Setting.showProgressBar) ViewUIPlus.LoadingBar.finish();
  // 多页控制 打开新的页面
  if (
    !('meta' in to) ||
    (to.meta && !('tabs' in to.meta)) ||
    (to.meta && to.meta.tabs)
  ) {
    store.dispatch('admin/page/open', to);
  }

  // 更改标题
  util.title({
    title: to.meta.title,
  });
  // 返回页面顶端
  window.scrollTo(0, 0);
});

export default router;
